Space Lua runs in the browser and has direct access to JavaScript APIs through the js module. This enables you to use the browser's native capabilities and import external JavaScript libraries. Use this functionality with caution. With great power comes comes great responsibility.
The full API reference is at API/js.
Use js.window to access the browser's window object:
-- Get the current URL
local url = js.window.location.href
-- Set a timeout
js.window.setTimeout(function()
editor.flashNotification("Timer fired!")
end, 3000)
Use js.import to load JavaScript modules from URLs (typically via CDNs like esm.sh):
local lodash = js.import("https://esm.sh/[email protected]")
local chunks = lodash.chunk({1, 2, 3, 4, 5, 6}, 2)
print(js.stringify(chunks)) -- [[1,2],[3,4],[5,6]]
Lua tables and JavaScript objects/arrays are different types. Space Lua tries its best to map between them the best in can, but sometimes you may need finer grained control:
js.tojs(luaValue) — converts a Lua value to its JavaScript equivalentjs.tolua(jsValue) — converts a JavaScript value to its Lua equivalentUse js.new to instantiate JavaScript classes:
local obj = js.new(SomeConstructor, arg1, arg2)
Space Lua handles JavaScript promises transparently. When a JavaScript function returns a Promise, Space Lua automatically awaits it — you don't need to write any special async/await code:
-- This just works, even though fetch() returns a Promise
local response = js.window.fetch("https://api.example.com/data")
Use js.eachIterable to iterate over JavaScript async iterables:
for value in js.eachIterable(someAsyncIterable) do
print(value)
end
Use js.log to write to the browser's developer console:
js.log("Debug:", {name = "test", count = 42})